//
//  CZNetworkTool.swift
//  GZWeibo007
//
//  Created by 黄伟 on 15/12/24.
//  Copyright © 2015年 itcast. All rights reserved.
//

import UIKit

import AFNetworking

class CZNetworkTool: AFHTTPSessionManager {
    
    // 第一种创建单例的方法
    // 单例,因为继承AFHTTPSessionManager，所以可以调用默认的构造方法
//    static let sharedInstance: CZNetworkTool = {
//        
//        // 网址前面相同的URL
//        let baseURL = NSURL(string: "https://api.weibo.com/")!
//        
//        let tool = CZNetworkTool(baseURL: baseURL)
//        return tool
//    }()
    
    // 第二种创建单例的方法
    // 单例, 调用默认构造方法
    static let sharedInstance: CZNetworkTool = CZNetworkTool()
    
    // 不让别人访问构造方法
    private init () {
        // 没有初始化的属性
        let baseURL = NSURL(string: "https://api.weibo.com/")!
        // 在构造函数里面子类不能调用父类的便利构造函数,需要调用父类的指定构造函数
        //        super.init(baseURL: baseURL)
        super.init(baseURL: baseURL, sessionConfiguration: nil)
        // 方法的调用必须在 super.init 只有 调用父类的super.init之后,对象才创建完毕,对象创建完毕才能调用对象的方法
        
        // 设置响应的序列化器,支持text/plain
        self.responseSerializer.acceptableContentTypes?.insert("text/plain")
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    
    // MARK: - 授权相关
    /// app key
    private let client_id = "3752332273"
    
    /// 授权回调地址
    let redirect_uri = "http://www.baidu.com/"
    
    /// app秘钥
    private let client_secret = "b229fcf4f8387bb67cd2fef33ecb69f7"
    
    /// 拼接登录界面的URL地址
    func oAuthRUL() ->NSURL {
        
        // 拼接URL，返回的是string类型
        let urlString = "https://api.weibo.com/oauth2/authorize?client_id=\(client_id)&redirect_uri=\(redirect_uri)"
        
        return NSURL(string: urlString)!
    }
    
    // MARK: -加载AccessToken
    // 当网络请求成功或失败需要高数调用的对象，使用闭包回调
    func loadAccessToken(code: String,finished: (result: [String: AnyObject]?, error: NSError?) -> ()) {
        // url地址
//        let urlString = "https://api.weibo.com/oauth2/access_token"
        // url地址, 可以省略前面的baseURL,AFN会自动帮我们加上
        let urlString = "oauth2/access_token"
        
        // 请求参数，字典
        let parameters = [
            "client_id": client_id,
            "client_secret": client_secret,
            "grant_type": "authorization_code",
            "code": code,
            "redirect_uri": redirect_uri
        ]
        
        // 发送POST请求,AFNetworking框架的方法
        POST(urlString, parameters: parameters, success: { (_, result) -> Void in
            // 调用闭包
            // 需要酱返回结果转成字典,使用 as？，因为闭包的result参数是一个[String : AnyObject]?,说明可以串nil
            let dict = result as? [String : AnyObject]
            // 在这里调用从对象调用方法传入的闭包，实现回调
            finished(result: dict, error: nil)
            }) { (_, error) -> Void in
                // 在这里调用从对象调用方法传入的闭包，实现回调
                finished(result: nil, error: error)
        }
    }
    
    // MARK: - 加载用户信息
    func loadUserInfo(finished: (result: [String: AnyObject]?,error: NSError?) -> ()) {
//        // 获取AccessToken,判断AccessToken是否有值
//        if let access_token = CZUserAccount.loadUserAccount()?.access_token {
//            // access_token有值,会进来
//
//            if let uid = CZUserAccount.loadUserAccount()?.uid {
//                // uid有值, 才能去发送请求,代码嵌套会比较多
//            }
//        }
        
        // 1.获取AccessToken,判断AccessToken是否有值
        // 守卫--与if else相反
        guard let access_token = CZUserAccount.loadUserAccount()?.access_token else {
            // 没有值就进来
            print("access_token没有值")
            return
        }
        
        // 能到这里来说明 access_token 是有值的
        
        // 2.获取用户的uid
        guard let uid = CZUserAccount.loadUserAccount()?.uid else {
            // 能到这里面来uid没有值
            print("uid没有值")
            return
        }
        
        // 能到这里来说明uid是有值的.
        
        // 3.url地址, 可以省略baseURL,AFN会自动帮我们加上
        let urlString = "2/users/show.json"
        
        // 4.请求参数
        let parameters = [
            "access_token": access_token,
            "uid": uid
        ]
        
        // 5.发送请求获取用户数据
        GET(urlString, parameters: parameters, success: { (_, result) -> Void in
//            print("获取到用户数据: \(result)")
            // 6.调用准备好的闭包
            let dict = result as? [String: AnyObject]
            finished(result: dict, error: nil)
            }) { (_, error) -> Void in
//                print("error: \(error)")
            // 6.调用准备好的闭包
                finished(result: nil, error: error)
        }
    }
}























